home *** CD-ROM | disk | FTP | other *** search
/ Die Speccy' 97 / Die Speccy' 97.iso / amiga_system / the_aminet / util / cli / mcomms_1_4.lha / Src / examine.c < prev    next >
C/C++ Source or Header  |  1992-09-02  |  5KB  |  220 lines

  1. /****************************************************************************/
  2. /*                                Examine.c                                 */
  3. /*                    Examine file type using DataTypes                     */
  4. /*                    Copyright ⌐ 1994 Michael Letowski                     */
  5. /****************************************************************************/
  6.  
  7. #define __USE_SYSBASE
  8.  
  9. #include <exec/types.h>
  10. #include <exec/execbase.h>
  11. #include <exec/memory.h>
  12. #include <dos/rdargs.h>
  13. #include <dos/dos.h>
  14. #include <dos/dosasl.h>
  15. #include <dos/dosextens.h>
  16. #include <datatypes/datatypes.h>
  17. #include <datatypes/datatypesclass.h>
  18. #include <support/types.h>
  19. #include <support/exec.h>
  20. #include <support/dos.h>
  21.  
  22. #include <string.h>
  23.  
  24. #include <proto/exec.h>
  25. #include <proto/dos.h>
  26. #include <proto/datatypes.h>
  27.  
  28. #include "examine.rev.h"
  29.  
  30. #define DOS_NAME        "dos.library"
  31. #define DOS_VERN         37L
  32. #define DT_NAME            "datatypes.library"
  33. #define DT_VERN            39L
  34.  
  35. STATIC CONST TEXT VersionString[]=
  36.     VERSION(PROG_NAME,PROG_VERSION,PROG_REVISION,PROG_DATE);
  37.  
  38. #define TEMPLATE        "DIR/M,GROUPID=G/K,TYPEID=T/K,FULL/S,ID/S,ALL/S"
  39.  
  40. #define PAT_ALL            "#?"
  41. #define INFO_TEMPL    "Directory \"%s\"\n"
  42.  
  43. #define OPT_FILE        0
  44. #define OPT_GID            1
  45. #define OPT_TID            2
  46. #define OPT_FULL        3
  47. #define OPT_ID            4
  48. #define OPT_ALL            5
  49. #define OPT_COUNT        6
  50.  
  51. #define NAME_SIZE        32
  52. #define PATH_SIZE        256
  53. #define LONG_SIZE        5
  54.  
  55. #define FileName()    (Opts[OPT_FULL] ? (Anchor->ap_Buf) : (STRPTR)(FName))
  56.  
  57. STATIC VOID L2S(STRPTR buffer, ULONG x);
  58.  
  59. ULONG ExamineDT(VOID)
  60. {
  61.     struct ExecBase *SysBase=*((struct ExecBase **)4);
  62.     struct DosLibrary *DOSBase;
  63.     struct Library *DataTypesBase;
  64.  
  65.     STATIC CONST STRPTR NoArgs[]={PAT_ALL,NULL};
  66.  
  67.     struct RDArgs *Args;
  68.     struct AnchorPath *Anchor;
  69.     struct DataType *DT;
  70.     struct DataTypeHeader *DTH;
  71.     LONG Opts[OPT_COUNT];
  72.     ULONG I,TempRC,RC=RETURN_FAIL;
  73.     CHAR FName[NAME_SIZE],DName[PATH_SIZE],GroupID[LONG_SIZE],ID[LONG_SIZE];
  74.     STRPTR GroupName,TypeName,CurArg,FilePos,*ArgPtr;
  75.     BPTR CurrLock,OldLock,Handle;
  76.     BOOL ErrOccured=FALSE;
  77.  
  78.     unless(DOSBase=(struct DosLibrary *)OpenLibrary(DOS_NAME,DOS_VERN))
  79.     {
  80.         SetResult2(ERROR_INVALID_RESIDENT_LIBRARY);
  81.         goto InvalidDOS;
  82.     }
  83.  
  84.     unless(DataTypesBase=OpenLibrary(DT_NAME,DT_VERN))
  85.     {
  86.         CauseIoErr(ERROR_INVALID_RESIDENT_LIBRARY,NULL);
  87.         goto InvalidDataTypes;
  88.     }
  89.  
  90.     unless(Anchor=AllocVec(sizeof(struct AnchorPath)+PATH_SIZE,MEMF_CLEAR))
  91.     {
  92.         PrintFault(IoErr(),NULL);                                /* Inform user */
  93.         goto NoMemory;
  94.     }
  95.  
  96.     clear(&Opts);
  97.     unless(Args=ReadArgs(TEMPLATE,Opts,NULL))
  98.     {
  99.         PrintFault(IoErr(),NULL);                                /* Inform user */
  100.         goto NoArgs;
  101.     }
  102.  
  103.     ArgPtr=Opts[OPT_FILE] ? (STRPTR *)Opts[OPT_FILE] : (STRPTR *)NoArgs;
  104.     for(I=0; CurArg=*ArgPtr++; I++)
  105.     {
  106.         clear(Anchor);
  107.         Anchor->ap_Strlen=PATH_SIZE;
  108.         Anchor->ap_BreakBits=SIGBREAKF_CTRL_C;        /* Allow break */
  109.  
  110.         TempRC=MatchFirst(CurArg,Anchor);
  111.         if(TempRC==0)
  112.         {
  113.             if(I>0)                                                                    /* N-th argument */
  114.                 PutStr("\n");
  115.             if(Anchor->ap_Info.fib_DirEntryType>=0)    /* This is dir */
  116.             {
  117.                 fset(Anchor->ap_Flags,APF_DODIR);
  118.                 if(strlen(Anchor->ap_Buf)>0)
  119.                     Printf(INFO_TEMPL,Anchor->ap_Buf);
  120.             }
  121.             else                                                                        /* A file */
  122.             {
  123.                 clear(&DName);
  124.                 if((FilePos=PathPart(Anchor->ap_Buf))!=Anchor->ap_Buf)    /* Path exists */
  125.                     Printf(INFO_TEMPL,
  126.                                     strncpy(DName,Anchor->ap_Buf,FilePos-Anchor->ap_Buf));
  127.             }
  128.         }
  129.         while(TempRC==0)
  130.         {
  131.             strcpy(FName,Anchor->ap_Info.fib_FileName);
  132.             if(Anchor->ap_Info.fib_DirEntryType>=0)
  133.             {
  134.                 if(Opts[OPT_ALL])
  135.                 {
  136.                     if(!ftst(Anchor->ap_Flags,APF_DIDDIR))
  137.                         fset(Anchor->ap_Flags,APF_DODIR);
  138.                     fclr(Anchor->ap_Flags,APF_DIDDIR);
  139.                 }
  140.                 goto Next;
  141.             }
  142.  
  143.             CurrLock=DupLock(Anchor->ap_Current->an_Lock);
  144.             OldLock=CurrentDir(CurrLock);
  145.             if(Handle=Lock(FName,ACCESS_READ))
  146.             {
  147.                 if(DT=ObtainDataTypeA(DTST_FILE,(APTR)Handle,NULL))
  148.                 {
  149.                     DTH=DT->dtn_Header;
  150.                     L2S(GroupID,DTH->dth_GroupID);
  151.                     L2S(ID,DTH->dth_ID);
  152.                     if(Opts[OPT_GID] && strcmp(GroupID,(STRPTR)Opts[OPT_GID]))
  153.                         goto Release;
  154.                     if(Opts[OPT_TID] && strcmp(ID,(STRPTR)Opts[OPT_TID]))
  155.                         goto Release;
  156.                     if(Opts[OPT_FULL])
  157.                         Printf("%s\n",Anchor->ap_Buf);
  158.                     else
  159.                         Printf("%-30s ",FName);
  160.                     unless(GroupName=GetDTString(DTH->dth_GroupID))
  161.                         GroupName=GroupID;
  162.                     unless(TypeName=DTH->dth_Name)
  163.                         TypeName=ID;
  164.                     Printf("%-12s %-20s",GroupName,TypeName);
  165.                     if(Opts[OPT_ID])
  166.                         Printf(" %-4s %-4s",GroupID,ID);
  167.                     PutStr("\n");
  168. Release:
  169.                     ReleaseDataType(DT);
  170.                 }
  171.                 else
  172.                 {
  173.                     ErrOccured=TRUE;
  174.                     PrintFault(IoErr(),FileName());
  175.                 }
  176.                 UnLock(Handle);
  177.             }
  178.             else
  179.             {
  180.                 ErrOccured=TRUE;
  181.                 PrintFault(IoErr(),FileName());
  182.             }
  183.             CurrentDir(OldLock);
  184.             UnLock(CurrLock);
  185.  
  186. Next:
  187.             TempRC=MatchNext(Anchor);
  188.         }
  189.         if(TempRC==ERROR_NO_MORE_ENTRIES)
  190.             RC=(ErrOccured ? RETURN_ERROR : RETURN_OK);
  191.         else
  192.         {
  193.             PrintFault(TempRC,NULL);
  194.             RC=(TempRC==ERROR_BREAK ? RETURN_WARN : RETURN_FAIL);
  195.         }
  196.         MatchEnd(Anchor);
  197.         if(TempRC==ERROR_BREAK)
  198.             break;
  199.     }
  200.  
  201.     FreeArgs(Args);
  202. NoArgs:
  203.     FreeVec(Anchor);
  204. NoMemory:
  205.     CloseLibrary(DataTypesBase);
  206. InvalidDataTypes:
  207.     CloseLibrary((struct Library *)DOSBase);
  208. InvalidDOS:
  209.     return(RC);
  210. }
  211.  
  212. STATIC VOID L2S(STRPTR buffer, ULONG x)
  213. {
  214.     ULONG I;
  215.  
  216.     for(I=0; I<4; I++)
  217.         buffer[I]=x >> ((3-I) << 3);
  218.     buffer[I]='\0';
  219. }
  220.